package com.lizemin.custom.classloader.classloader;

import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author lzm
 * @date 2025/6/2 15:25
 * @description
 */
public class ComplierUtil {

    /**
     * 编译指定目录下的所有 .java 文件
     *
     * @param sourceDir  源码目录
     */
    public static void compile(String sourceDir) {
        // 1. 获取 Java 编译器
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        if (compiler == null) {
            System.err.println("错误：未找到 JDK 编译器（请确保使用 JDK 运行）");
            return;
        }

        // 2. 扫描项目目录，获取所有 .java 文件
        File projectDir = new File(sourceDir);
        List<File> javaFiles = findJavaFiles(projectDir);

        if (javaFiles.isEmpty()) {
            System.err.println("错误：未找到任何 .java 文件");
            return;
        }
        // 默认编译后的class文件在java文件所在目录
        List<String> options = Arrays.asList(
                "-encoding", "UTF-8"    // 指定编码（可选）
        );

        // 4. 获取 StandardJavaFileManager
        try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null)) {
            // 5. 将 File 转换为 JavaFileObject
            Iterable<? extends JavaFileObject> compilationUnits =
                    fileManager.getJavaFileObjectsFromFiles(javaFiles);

            // 6. 创建编译任务并执行
            JavaCompiler.CompilationTask task = compiler.getTask(
                    null,                   // 输出流（null = System.err）
                    fileManager,            // 文件管理器
                    null,                   // 诊断监听器（null = 默认）
                    options,                // 编译选项
                    null,                   // 需要预先加载的类
                    compilationUnits        // 要编译的源文件
            );

            boolean success = task.call();
            System.out.println("编译结果: " + (success ? "成功 ✅" : "失败 ❌"));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    // 递归查找所有 .java 文件
    private static List<File> findJavaFiles(File dir) {
        List<File> javaFiles = new ArrayList<>();
        if (!dir.exists()) {
            return javaFiles;
        }
        File[] files = dir.listFiles();
        if (files == null) {
            return javaFiles;
        }
        for (File file : files) {
            if (file.isDirectory()) {
                javaFiles.addAll(findJavaFiles(file)); // 递归扫描子目录
            } else if (file.getName().endsWith(".java")) {
                javaFiles.add(file);
            }
        }
        return javaFiles;
    }

    public static void main(String[] args) {
        ComplierUtil.compile("C:\\Users\\15871\\Documents\\csdn\\classloader");

    }


}
